// 接口本身不能绑定方法

// 接口是值类型，保存的是：值+原始类型
package main

import (
	"fmt"
)

// Animal 定义一个animal的接口，它有唱，跳，rap的方法
type Animal interface {
	sing()
	jump()
	rap()
}

// Chicken 需要全部实现这些接口
type Chicken struct {
	Name string
}

func (c Chicken) sing() {
	fmt.Println("chicken 唱")
}

func (c Chicken) jump() {
	fmt.Println("chicken 跳")
}
func (c Chicken) rap() {
	fmt.Println("chicken rap")
}

// Cat 需要全部实现这些接口
type Cat struct {
	Name string
}

func (c Cat) sing() {
	fmt.Println("cat 唱")
}

func (c Cat) jump() {
	fmt.Println("cat 跳")
}
func (c Cat) rap() {
	fmt.Println("cat rap")
}

func sing(ani Animal) {
	switch ani.(type) {
	case Cat:
		fmt.Printf("是一只猫")
	case Chicken:
		fmt.Printf("是一只鸡")
	}
	ani.sing()
}

// 空接口可以接受任何类型

// 换一种，任何类型都实现了空接口的定义
type EmptyInterface interface{}

func main() {
	chicken := Chicken{Name: "ik"}
	cat := Cat{Name: "ali"}
	sing(chicken)
	sing(cat)
}
